63 二叉树中的结点插入操作
-
需要考虑的问题 是否能在二叉树的任意结点处插入子结点? 是否需要指定新数据元素(新结点)的插入位置?
-
二叉树结点的位置枚举类型
enum BTNodePos{
ANY,
LEFT,
RIGHT
}; -
插入的方式
- 插入的新结点
bool insert(TreeNode<T> *node)
bool insert(TreeNode<T> *node,BTNodePos pos)
- 插入数据元素
bool insert(const T &value,TreeNode<T> *parent)
bool insert(const T &value,TreeNode<T> *parent,BTNodePos pos)
- 插入的新结点
-
新结点的插入
-
指定位置的结点插入
bool insert(n,np,pos)
//pos=ANY
if(np->left==nullptr){
np->left=n;
}
else if(np->right==nullptr){
np->right=n;
}
else{
ret = false;
}//pos=LEFT
if(np->left==nullptr){
np->left = n;
}
else{
ret = false;
}//pos=RIGHT
if(np->right=nullptr){
np->right=n;
}
else{
ret = false;
} -
插入新结点
-
插入数据元素
编程实验
-
二叉树的插入操作
小结
- 二叉树的插入操作需要指明插入的位置
- 插入操作必须正确处理指向父结点的指针
- 插入数据元素时需要从堆空间中创建结点
- 当数据元素插入失败时需要释放结点空间
思考:如何实现BTree(二叉树结构)的结点删除操作和清除操作?
64 二叉树中的结点删除与清除
二叉树中的结点删除
-
删除的方式
- 基于数据元素值的删除
SharedPointer<Tree<T>> remove(const T &value)
- 基于结点的删除
SharedPointer<Tree<T>> remove(TreeNode<T> *node)
- 基于数据元素值的删除
-
二叉树中结点的删除
-
删除操作功能的定义
void remove(BTreeNode<T> *node,BTree<T>* &ret)
- 将node为根结点的子树从原来的二叉树中删除
- ret作为子树返回(ret指向堆空间中的二叉树对象)
-
删除功能函数的实现
编程实验
-
二叉树结点的删除操作
二叉树中的结点清除
-
清除操作的定义
- void clear()
- 将二叉树中的所有结点清除(释放堆中的结点)
- void clear()
-
二叉树中结点的清楚
-
清除操作功能的定义
- free(node)
- 清除node为根结点的二叉树
- 释放二叉树中的每一个结点
- free(node)
编程实验
-
清除二叉树中的结点
小结
- 删除操作将目标结点所代表的子树移除
- 删除操作必须完善处理父结点和子结点的关系
- 清除操作用于销毁树中的每一个结点
- 销毁结点时判断是否释放对应的内存空间(工厂模式)